import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-07-19
 * Time: 8:21
 */

class Solution {
    public String decodeString(String s) {

        //创建数字栈
        Stack<Integer> numStack = new Stack<>();
        // 创建字符栈
        Stack<StringBuilder> strStack = new Stack<>();
        //记录左括号前面的数字
        int digit = 0;

        //记录左括号前的字符串
        StringBuilder res = new StringBuilder();

        // 从头到尾遍历编码字符串
        for (int i = 0; i < s.length(); i++) {
            //保存遍历的字符
            char ch = s.charAt(i);
            if (Character.isDigit(ch)) {
                //如果发现遍历的是数字,那么将它转化成数字
                int num = ch - '0';
                //防止为多位数字,这里要进行进位计算
                digit = digit * 10 + num ;
            }else if((ch >= 'a' && ch <= 'z') ){
                //如果是字符就将它拼接到res中
                res.append(ch);
            }else if (ch == '[') {
                //如果发现是左括号,我们就要按左括号前的数字和字符全部放入到各自的栈中
                // 把数字存放到数字栈
                numStack.push(digit);
                // 把外层的解码字符串存放到字符串栈
                strStack.push(res);

                //每次将左括号前面的数字放入栈中,都要重新开始记录数字和字符串
                //为下一次遇到右括号或者在解码做准备
                //这一次是保存左括号后面的数字和字符串
                digit = 0;
                res = new StringBuilder();

                // 4、如果是"]"
            }else if (ch == ']') {
                //如果发现右括号,那证明可以解一次码
                //就将其在占中保存的数字和字符串进行弹出与前面的字符串进行拼接
                int count = numStack.pop();
                StringBuilder outString = strStack.pop();

                // 第三步，不断的把内层解码的字符串拼接起来
                for (int j = 0; j < count; j++) {

                    // 拼接到 outString 后面，拼接 count 次
                    outString.append(res.toString());
                }

                // 再把此时得到的结果赋值给 res
                res = outString;
            }
        }

        // 返回解码成功的字符串
        return res.toString();
    }
}

public class TestDemo {


    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.decodeString("3[a2[c]]");

    }



    public static void main2(String[] args) {
        Map<Integer,String> map = new HashMap<>();
//        for(Map.Entry<String,String> entry:map.entrySet()){
//            System.out.println(entry.getKey()+entry.getValue());
//        }

        map.put(1,"张三");
        map.put(2,"三");
        map.put(3,"里三");
        map.put(4,"牌三");
        map.put(5,"归还三");

        for(Integer key : map.keySet()){
            String value = map.get((key));
            System.out.println(key +"->"+ value);
        }

        StringBuilder s = new StringBuilder();
        s.append("i");
        s.append(s);
        System.out.println(s.delete(0, s.length()));
        System.out.println(s);
    }









    public static void main1(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("a");
        list.add("a");
        list.add("a");
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }

}
